package com.cysyz.mylib.jbpm;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.history.HistoryProcessInstance;
import org.jbpm.api.history.HistoryTask;
import org.jbpm.api.task.Task;

import com.cysyz.mylib.jbpm.impl.JBPMProcessEngineSimpleOperateImpl.ProcessDefintionQueryConds;
import com.cysyz.mylib.jbpm.impl.JBPMProcessEngineSimpleOperateImpl.TaskQueryConds;

public interface IJBPMProcessEnginSimpleOperator {

	public abstract ProcessEngine getProcessEngine();

	public abstract void setProcessEngine(ProcessEngine processEngine);

	/**
	 * 一：部署流程定义（部署ZIP文件格式的流程定义）
	 * 
	 * @param fileName
	 *            文件名称
	 * */
	public abstract String deploymentProcessDefinitionByClassPathZip(
			String fileName);

	/**
	 * 一：部署流程定义（部署ZIP文件格式的流程定义）
	 * 
	 * @param file
	 *            文件
	 * */
	public String deploymentProcessDefinitionByClassPathZip(File file)
			throws FileNotFoundException;

	/**
	 * 二：部署流程定义（从类路径下部署流程定义）
	 * 
	 * @param fileName
	 *            文件名称
	 * */
	public abstract String deploymentProcessDefinitionByClassPathFile(
			String fileName);

	/**
	 * 查询流程定义的集合
	 * 
	 * @return
	 */
	public abstract List<ProcessDefinition> findProcessDefinitionList(
			ProcessDefintionQueryConds conds);

	/**
	 * 查询流程定义
	 * 
	 * @return
	 */
	public abstract ProcessDefinition findProcessDefinition(
			ProcessDefintionQueryConds conds);

	/**
	 * 查询流程定义的个数
	 * 
	 * @return
	 */
	public abstract long findProcessDefinitionListCount(
			ProcessDefintionQueryConds conds);

	/**
	 * 查询我的个人任务列表
	 * 
	 * @return
	 */
	public abstract List<Task> findMyPersonalTaskList(TaskQueryConds conds);

	/**
	 * 查询我的个人任务
	 * 
	 * @return
	 */
	public abstract Task findMyPersonalTask(TaskQueryConds conds);

	/**
	 * 查询我的个人任务个数
	 * 
	 * @return
	 */
	public abstract long findMyPersonalTaskListCount(TaskQueryConds conds);

	/**
	 * 五：查看历史的任务
	 * 
	 * @return
	 */
	public abstract List<HistoryTask> historyTask(String userId);

	/**
	 * 五：查看历史的流程实例
	 * 
	 * @return
	 */
	public abstract List<HistoryProcessInstance> historyProcessInstance(
			String processInstanceId);

	/** 二：启动流程实例, 带流程变量 */
	public abstract void startProcessInstanceByKey(String key,
			Map<String, ?> processVariableMap);

	/** 二：启动流程实例 */
	public abstract void startProcessInstanceByKey(String key);

	/** 完成任务 */
	public abstract void completeTask(String taskId);

	/** 完成任务 */
	public abstract void completeTask(String taskId, String outcome);

	/** 向后执行一步（用来当前流程无法处理，由管理员的身份可以跳过该流程） */
	public abstract void signalExecution(String executionId);

	/**
	 * 向后执行一步（用来当前流程无法处理，由管理员的身份可以跳过该流程） 注意：如果当前流程只有一个活动环节的时候，此时不需要指定连线
	 * 但是如果当前流程有多个活动环节的时候，此时就需要指定连线，才能执行向后执行一步
	 * */
	public abstract void signalExecution(String executionId, String outcome);

	/**
	 * 设置流程变量 可存放的值的类型 *基本数据类型 *变量中存放javabean对象，前提：让javabean对象实现implements
	 * java.io.Serializable *存放的hibernate的实体对象（javabean对象），使用数据库表的方式存放流程变量
	 * 
	 * */
	public abstract void setVariable(String executionId, String key,
			Object value);

	/**
	 * 一次性设置多个流程变量
	 * 
	 * *
	 */
	public abstract void setVariables(String executionId,
			Map<String, ?> variables);

	/**
	 * 获取流程变量 可能异常：懒加载异常： 解决懒加载异常： 方案一：在Pserson.hbm.xml中定义：<class
	 * name="cn.itcast.d_processVariables.Person" table="person" lazy="false">
	 * 方案二：在Person.java中定义：public final class Person
	 * */
	public abstract Object getVariable(String executionId, String key);

	/**
	 * 一次性获取多个流程变量
	 * 
	 * @param executionId
	 *            executionId
	 * @param variableNames
	 *            变量名的集合
	 */
	public Map<String, Object> getVariables(String executionId,
			Set<String> variableNames);

	/**
	 * 一次性获取流程中所有流程变量
	 * 
	 * @param executionId
	 *            executionId
	 * @param variableNames
	 *            变量名的集合
	 */
	public Map<String, Object> getVariables(String executionId);

	/** 将组任务分配给个人任务(前提：之前是个组任务) */
	public abstract void takeTask(String taskId, String userId);

	/**
	 * 将个人任务分配某个制定的人(之前的任务，要是组任务)
	 * 
	 * @param taskId
	 * @param userId
	 * */
	public abstract void assignTask(String taskId, String userId);

	/**
	 * 将个人任务分配给组任务(之前的任务，要是组任务)
	 * 
	 * @param taskId
	 */
	public abstract void assignTask(String taskId);

	/**
	 * 向组任务中添加人员
	 * 
	 * @param taskId
	 * @param userId
	 */
	public abstract void addPaticipation(String taskId, String userId);

	/**
	 * 向组任务删除人员
	 * 
	 * @param taskId
	 * @param userId
	 */
	public abstract void removePaticipation(String taskId, String userId);

	/**
	 * 查看流程图
	 * 
	 * @param deploymentId
	 * @param resourceName
	 * @return
	 */
	public abstract InputStream findImage(String deploymentId,
			String resourceName);

	/**
	 * 删除流程定义 deleteDeployment:不带级联的删除<br/>
	 * 如果一个流程没有启动，说明流程正在执行，此时可以使用deleteDeployment方法进行删除<br/>
	 * 但是如果一个流程已经启动，此时不可以使用deleteDeployment方法进行删除，否则会抛出异常<br/>
	 * deleteDeploymentCascade:带级联的删除（项目中使用）<br/>
	 * 不管流程是否正在执行，都能删除对应的数据<br/>
	 * 此方法内部使用deleteDeploymentCascade<br/>
	 * 
	 * @param deploymentId
	 */
	public abstract void deleteProcessDefinition(String deploymentId);

}